extends Node
# 其实原本也可以直接集中在level的脚本中吧……不过分散开来逻辑应该更清楚点
#或者特色功能放在子节点？
# 而且level还可以另外附加个性化的关卡效果（预留一下）
# 主：目前旋转方式可能和网格还没有完全对应……（需要调整……四舍五入方式？……至少对准一个格子吧）

#const cell_offset = Vector3(0.5,0.5,0.5)

#方盒是绝对坐标，不是相对于center的offset
#选取范围似乎会向正轴偏一些？
@export var rotation_immune:Array[Node3D] #免疫旋转操作
@export var basis_rotation_immune:Array[Node3D] #免疫basis旋转，一般至少会把玩家加进去

#目前旋转方式可能和网格还没有完全对应……
# 不加cell_offet的话，表现在grid不带center状态下就正常，但是grid会……
#好吧，为了省事，还是用调整grid的方法吧……大不了设计时装上，完了后取消掉
func rotate_entity(center:Vector3,axis:Vector3i, entity:Node3D,):
	# 单实体旋转的可以留着
	if entity not in rotation_immune:
		var offset = entity.position - center
		var new_offset = offset.rotated(axis, PI/2)
		entity.position = center + new_offset
		# 新加入功能
		if entity not in basis_rotation_immune:
			entity.basis = entity.basis.rotated(axis, PI/2)
			if entity is CharacterBody3D:
				entity.velocity = entity.velocity.rotated(axis, PI/2)
	


func rotate_entities(area:AABB,axis:Vector3i):
	#传入的center是与Entities的相对坐标（绝对坐标减法），所以这里下面的实体使用本地变换transform应该就可以
	#对于一个旋转层而言，控制的旋转层一般是不中途改变的……
	#但是如果搞运动中的节点……就需要在旋转时再获取一下大小吧
	for entity in get_children():
		if area.has_point(entity.global_transform.origin):
			#这里的“旋转”实际上是改变坐标，而不是物体自身旋转了……应该没有自带函数吧
			rotate_entity(area.get_center(), axis, entity)
